package thread;

import com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator;

/**
 * 线程等待 - join方法 - 成员方法
 * @author yuisama
 * @date 2022/06/17 19:49
 **/
public class ThreadJoin {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "还在学习JavaSE阶段...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        },"JavaSE线程");
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "进入数据结构的学习部分");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        },"数据结构线程");
        System.out.println("先学习JavaSE");
        t1.start();
        // 主线程死等t1，直到t1执行结束主线程再恢复执行
        t1.join();
        // 此时走到这里，t1线程已经执行结束，再启动t2线程
        t2.start();
        // 在哪调用别的线程的join方法，阻塞的是调用join的线程
        // main -> 调用t2.join() 阻塞主线程，直到t2完全执行结束再恢复主线程的执行
        // 主线程只等t2 2000ms - 2s，若t2在2s之内还没结束，主线程就会恢复执行
        t2.join(2000);
        // t2线程也执行结束了，继续执行主线程
        System.out.println("开始学习JavaEE");
        System.out.println(Thread.currentThread().getName());
    }
}